package com.bitmonlab.osiris.api.map.rest.impl; import javax.inject.Inject; import javax.inject.Named; import javax.validation.Valid; import javax.validation.constraints.NotNull; import javax.ws.rs.Consumes; import javax.ws.rs.DELETE; import javax.ws.rs.GET; import javax.ws.rs.HeaderParam; import javax.ws.rs.POST; import javax.ws.rs.PUT; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import org.hibernate.validator.constraints.NotBlank; import com.bitmonlab.osiris.api.core.map.exceptions.FeatureNotExistException; import com.bitmonlab.osiris.api.core.map.exceptions.MongoGeospatialException; import com.bitmonlab.osiris.api.core.map.managers.impl.FeatureManagerImpl; import com.bitmonlab.osiris.api.core.map.transferobject.FeatureDTO; import com.bitmonlab.osiris.api.map.rest.api.FeatureResource; import com.bitmonlab.osiris.commons.map.model.geojson.Feature; import com.bitmonlab.osiris.commons.model.security.BasicAuth; import com.bitmonlab.osiris.core.assembler.Assembler; import com.bitmonlab.osiris.core.assembler.AssemblyException; import com.bitmonlab.osiris.core.validations.annotations.ValidationRequired; import com.bitmonlab.osiris.core.validations.rest.violationProcessor.RestViolationProcessor; import com.bitmonlab.osiris.core.validations.validator.Validations; import com.wordnik.swagger.annotations.Api; import com.wordnik.swagger.annotations.ApiOperation; import com.wordnik.swagger.annotations.ApiParam; import com.wordnik.swagger.annotations.ApiResponse; import com.wordnik.swagger.annotations.ApiResponses; import com.yammer.dropwizard.auth.Auth; @Api("/osiris/geolocation/territory/feature") @Path("/osiris/geolocation/territory/feature") @Named //@Consumes({ MediaType.APPLICATION_JSON }) //@Produces({ MediaType.APPLICATION_JSON }) public class FeatureResourceImpl implements FeatureResource{ @Inject private FeatureManagerImpl featureManager; @Inject @Named("FeatureAssembler") private Assembler<FeatureDTO, Feature> featureAssembler; @Inject @Named("validationsOsirisMap") private Validations validations; @Override @POST @ValidationRequired(processor = RestViolationProcessor.class) @ApiOperation(value = "Store a feature", httpMethod="POST", response=FeatureDTO.class) @ApiResponses(value = { @ApiResponse(code = 200, message = "Feature was stored", response=FeatureDTO.class), @ApiResponse(code = 400, message = "Latitude range out of index"), @ApiResponse(code = 400, message = "Longitude range out of index"), @ApiResponse(code = 400, message = "Geometry is invalid"), @ApiResponse(code = 400, message = "Mongo GeoJSON format is not correct"), @ApiResponse(code = 400, message = "Invalid input parameter (header)")}) public Response storeFeature(@Auth BasicAuth principal, @ApiParam(value = "Application identifier", required = true) @NotBlank @NotNull @HeaderParam("api_key") String appIdentifier, @ApiParam(required=true, value="Feature") @Valid @NotNull FeatureDTO featureDTO) throws AssemblyException, MongoGeospatialException { validations.checkIsNotNullAndNotBlank(appIdentifier); validations.checkIsNotNull(featureDTO); Feature feature = featureManager.storeFeature(appIdentifier, featureAssembler.createDomainObject(featureDTO)); FeatureDTO featureResponseDTO=featureAssembler.createDataTransferObject(feature); return Response.ok(featureResponseDTO).build(); } @Override @Path("/{idFeature}") @DELETE @ValidationRequired(processor = RestViolationProcessor.class) @ApiOperation(value = "Delete a feature", httpMethod="DELETE") @ApiResponses(value = { @ApiResponse(code = 204, message = "Feature was deleted"), @ApiResponse(code = 400, message = "Invalid input parameter (header)"), @ApiResponse(code = 404, message = "Feature was not found")}) public Response deleteFeature(@Auth BasicAuth principal, @ApiParam(value = "Application identifier", required = true) @NotBlank @NotNull @HeaderParam("api_key") String appIdentifier, @ApiParam(required=true, value="Feature identifier") @NotBlank @NotNull @PathParam("idFeature") String idFeature) throws FeatureNotExistException { // TODO Auto-generated method stub validations.checkIsNotNullAndNotBlank(appIdentifier,idFeature); featureManager.deleteFeature(appIdentifier, idFeature); return Response.noContent().build(); } @Override @Path("/{idFeature}") @PUT @ValidationRequired(processor = RestViolationProcessor.class) @ApiOperation(value = "Update a feature", httpMethod="PUT", response=FeatureDTO.class) @ApiResponses(value = { @ApiResponse(code = 200, message = "Feature was updated", response=FeatureDTO.class), @ApiResponse(code = 400, message = "Latitude range out of index"), @ApiResponse(code = 400, message = "Longitude range out of index"), @ApiResponse(code = 400, message = "Geometry is invalid"), @ApiResponse(code = 400, message = "Mongo GeoJSON format is not correct"), @ApiResponse(code = 400, message = "Invalid input parameter (header)"), @ApiResponse(code = 404, message = "Feature was not found")}) public Response updateFeature(@Auth BasicAuth principal, @ApiParam(value = "Application identifier", required = true) @NotBlank @NotNull @HeaderParam("api_key") String appIdentifier, @ApiParam(required=true, value="Feature identifier") @NotBlank @NotNull @PathParam("idFeature") String idFeature, @ApiParam(required=true, value="Updated feature") @Valid @NotNull FeatureDTO featureDTO) throws AssemblyException, FeatureNotExistException, MongoGeospatialException { // TODO Auto-generated method stub validations.checkIsNotNullAndNotBlank(appIdentifier,idFeature); validations.checkIsNotNull(featureDTO); Feature featureUpdate = featureManager.updateFeature(appIdentifier, idFeature, featureAssembler.createDomainObject(featureDTO)); FeatureDTO featureUpdateDTO=featureAssembler.createDataTransferObject(featureUpdate); return Response.ok(featureUpdateDTO).build(); } @Override @Path("/{idFeature}") @GET @ValidationRequired(processor = RestViolationProcessor.class) @ApiOperation(value = "Get a feature by id", httpMethod="GET", response=FeatureDTO.class) @ApiResponses(value = { @ApiResponse(code = 200, message = "Feature was found", response=FeatureDTO.class), @ApiResponse(code = 400, message = "Invalid input parameter (header)"), @ApiResponse(code = 404, message = "Feature was not found")}) public Response getFeatureByID(@Auth BasicAuth principal, @ApiParam(value = "Application identifier", required = true) @NotBlank @NotNull @HeaderParam("api_key") String appIdentifier, @ApiParam(required=true, value="Feature identifier") @NotBlank @NotNull @PathParam("idFeature") String idFeature) throws AssemblyException, FeatureNotExistException { // TODO Auto-generated method stub validations.checkIsNotNullAndNotBlank(appIdentifier,idFeature); Feature feature = featureManager.getFeatureByID(appIdentifier,idFeature); FeatureDTO featureDTO=featureAssembler.createDataTransferObject(feature); return Response.ok(featureDTO).build(); } }